/*
 * test_tree.cpp
 *
 *  Created on: Oct 30, 2012
 *      Author: Federico Orquera
 */

#include "bplusfilehandler/newMockFile.h"
#include "BPlusTreeTemplate.h"

using std::cout;
using std::endl;

int main(){

	newMockFile mock("asd");

	BPlusTreeTemplate<BPTkey_t, BPTvalue_t, keyComparator_func> testTree(&mock);

	BPTkey_t
			test1 ("Hola"),
			test2 ("Mundo"),
			test3 ("Zorro"),
			test4 ("Aurora"),
			test5 ("Perro"),
			test6 ("Matias"),
			test7 ("Pure"),
			test8 ("Ponies"),
			test9 ("Mango"),
			test10("Moneda"),
			test11("Aruba"),
			test12("Andorra"),
			test13("Atencion"),
			test14("Arisco"),
			test15("Marisco"),
			test16("Persona"),
			test17("Pureza"),
			test18("Vaso"),
			test19("sopa"),
			test20("personal"),
			test21("billete"),
			test22("poniez"),
			test23("zzzzzzzz"),
			test24("a");

	LeafRegister_ptr
		testPtr1 (new LeafRegister_t(test1,  test2)),
		testPtr2 (new LeafRegister_t(test2,  test3)),
		testPtr3 (new LeafRegister_t(test3,  test4)),
		testPtr4 (new LeafRegister_t(test4,  test5)),
		testPtr5 (new LeafRegister_t(test5,  test6)),
		testPtr6 (new LeafRegister_t(test6,  test7)),
		testPtr7 (new LeafRegister_t(test7,  test8)),
		testPtr8 (new LeafRegister_t(test8,  test9)),
		testPtr9 (new LeafRegister_t(test9,  test10)),
		testPtr10(new LeafRegister_t(test10, test11)),
		testPtr11(new LeafRegister_t(test11, test12)),
		testPtr12(new LeafRegister_t(test12, test13)),
		testPtr13(new LeafRegister_t(test13, test14)),
		testPtr14(new LeafRegister_t(test14, test15)),
		testPtr15(new LeafRegister_t(test15, test16)),
		testPtr16(new LeafRegister_t(test16, test17)),
		testPtr17(new LeafRegister_t(test17, test18)),
		testPtr18(new LeafRegister_t(test18, test19)),
		testPtr19(new LeafRegister_t(test19, test20)),
		testPtr20(new LeafRegister_t(test20, test21)),
		testPtr21(new LeafRegister_t(test21, test22)),
		testPtr22(new LeafRegister_t(test22, test23)),
		testPtr23(new LeafRegister_t(test23, test24)),
		testPtr24(new LeafRegister_t(test24, test1));

	cout<<endl<<"Insertando multiples registros en el arbol:"<<endl<<endl;
	testTree.MostrarContenidoReducido("\t ");
	cout<<"InsertRegister("<<testPtr1->getKey()<<")"<<endl<<endl;
	testTree.InsertRegister(testPtr1);
	testTree.MostrarContenidoReducido("\t ");

	cout<<"InsertRegister("<<testPtr2->getKey()<<")"<<endl<<endl;
	testTree.InsertRegister(testPtr2);
	testTree.MostrarContenidoReducido("\t ");

	cout<<"InsertRegister("<<testPtr3->getKey()<<")"<<endl<<endl;
	testTree.InsertRegister(testPtr3);
	testTree.MostrarContenidoReducido("\t ");

	cout<<"InsertRegister("<<testPtr4->getKey()<<")"<<endl<<endl;
	testTree.InsertRegister(testPtr4);
	testTree.MostrarContenidoReducido("\t ");

	cout<<"InsertRegister("<<testPtr5->getKey()<<")"<<endl<<endl;
	testTree.InsertRegister(testPtr5);
	testTree.MostrarContenidoReducido("\t ");

	cout<<"InsertRegister("<<testPtr6->getKey()<<")"<<endl<<endl;
	testTree.InsertRegister(testPtr6);
	testTree.MostrarContenidoReducido("\t ");

	cout<<"InsertRegister("<<testPtr7->getKey()<<")"<<endl<<endl;
	testTree.InsertRegister(testPtr7);
	testTree.MostrarContenidoReducido("\t ");

	cout<<"InsertRegister("<<testPtr8->getKey()<<")"<<endl<<endl;
	testTree.InsertRegister(testPtr8);
	testTree.MostrarContenidoReducido("\t ");

	cout<<"InsertRegister("<<testPtr9->getKey()<<")"<<endl<<endl;
	testTree.InsertRegister(testPtr9);
	testTree.MostrarContenidoReducido("\t ");

	cout<<"InsertRegister("<<testPtr10->getKey()<<")"<<endl<<endl;
	testTree.InsertRegister(testPtr10);
	testTree.MostrarContenidoReducido("\t ");

	cout<<"InsertRegister("<<testPtr11->getKey()<<")"<<endl<<endl;
	testTree.InsertRegister(testPtr11);
	testTree.MostrarContenidoReducido("\t ");

	cout<<"InsertRegister("<<testPtr12->getKey()<<")"<<endl<<endl;
	testTree.InsertRegister(testPtr12);
	testTree.MostrarContenidoReducido("\t ");

	cout<<"InsertRegister("<<testPtr13->getKey()<<")"<<endl<<endl;
	testTree.InsertRegister(testPtr13);
	testTree.MostrarContenidoReducido("\t ");

	cout<<"InsertRegister("<<testPtr14->getKey()<<")"<<endl<<endl;
	testTree.InsertRegister(testPtr14);
	testTree.MostrarContenidoReducido("\t ");

	cout<<"InsertRegister("<<testPtr15->getKey()<<")"<<endl<<endl;
	testTree.InsertRegister(testPtr15);
	testTree.MostrarContenidoReducido("\t ");

	cout<<"InsertRegister("<<testPtr16->getKey()<<")"<<endl<<endl;
	testTree.InsertRegister(testPtr16);
	testTree.MostrarContenidoReducido("\t ");

	cout<<"InsertRegister("<<testPtr17->getKey()<<")"<<endl<<endl;
	testTree.InsertRegister(testPtr17);
	testTree.MostrarContenidoReducido("\t ");

	cout<<"InsertRegister("<<testPtr18->getKey()<<")"<<endl<<endl;
	testTree.InsertRegister(testPtr18);
	testTree.MostrarContenidoReducido("\t ");

	cout<<"InsertRegister("<<testPtr19->getKey()<<")"<<endl<<endl;
	testTree.InsertRegister(testPtr19);
	testTree.MostrarContenidoReducido("\t ");

	cout<<"InsertRegister("<<testPtr20->getKey()<<")"<<endl<<endl;
	testTree.InsertRegister(testPtr20);
	testTree.MostrarContenidoReducido("\t ");

	cout<<"InsertRegister("<<testPtr21->getKey()<<")"<<endl<<endl;
	testTree.InsertRegister(testPtr21);
	testTree.MostrarContenidoReducido("\t ");

	cout<<"SearchRegister("<<testPtr8->getKey()<<") ";
	searchResult_t resultado = testTree.SearchRegister(testPtr8->getKey());
	cout<<( ( resultado.valid && resultado.result->getKey() == testPtr8->getKey())?  "OK":"FAIL")<<endl<<endl;
	cout<<"key: "<<resultado.result->getKey()<<" value: "<<resultado.result->getValue()<<" valid: "<<((resultado.valid)?"TRUE":"FALSE")<<endl<<endl;

	cout<<"SearchRegister("<<testPtr22->getKey()<<") ";
	resultado = testTree.SearchRegister(testPtr22->getKey());
	cout<<( ( resultado.valid && keyComparator_func(testPtr22->getKey(), resultado.result->getKey()))?  "OK":"FAIL")<<endl<<endl;
	cout<<"key: "<<resultado.result->getKey()<<" value: "<<resultado.result->getValue()<<" valid: "<<((resultado.valid)?"TRUE":"FALSE")<<endl<<endl;

	cout<<"SearchRegister("<<testPtr23->getKey()<<") ";
	resultado = testTree.SearchRegister(testPtr23->getKey());
	cout<<( ( !resultado.valid && keyComparator_func(resultado.result->getKey(), testPtr23->getKey()))?  "OK":"FAIL")<<endl<<endl;
	cout<<"key: "<<resultado.result->getKey()<<" value: "<<resultado.result->getValue()<<" valid: "<<((resultado.valid)?"TRUE":"FALSE")<<endl<<endl;

	cout<<"SearchRegister("<<testPtr24->getKey()<<") ";
	resultado = testTree.SearchRegister(testPtr24->getKey());
	cout<<( ( resultado.valid && keyComparator_func(testPtr24->getKey(), resultado.result->getKey()))?  "OK":"FAIL")<<endl<<endl;
	cout<<"key: "<<resultado.result->getKey()<<" value: "<<resultado.result->getValue()<<" valid: "<<((resultado.valid)?"TRUE":"FALSE")<<endl<<endl;

	cout<<"SearchNextRegister("<<resultado.result->getKey()<<") ";
	resultado = testTree.SearchNextRegister(resultado);
	cout<<"key: "<<resultado.result->getKey()<<" value: "<<resultado.result->getValue()<<" valid: "<<((resultado.valid)?"TRUE":"FALSE")<<" nextNode: "<<resultado.nextNode<<endl<<endl;

	cout<<"SearchNextRegister("<<resultado.result->getKey()<<") ";
	resultado = testTree.SearchNextRegister(resultado);
	cout<<"key: "<<resultado.result->getKey()<<" value: "<<resultado.result->getValue()<<" valid: "<<((resultado.valid)?"TRUE":"FALSE")<<" nextNode: "<<resultado.nextNode<<endl<<endl;

	cout<<"SearchNextRegister("<<resultado.result->getKey()<<") ";
	resultado = testTree.SearchNextRegister(resultado);
	cout<<"key: "<<resultado.result->getKey()<<" value: "<<resultado.result->getValue()<<" valid: "<<((resultado.valid)?"TRUE":"FALSE")<<" nextNode: "<<resultado.nextNode<<endl<<endl;

	cout<<"SearchNextRegister("<<resultado.result->getKey()<<") ";
	resultado = testTree.SearchNextRegister(resultado);
	cout<<"key: "<<resultado.result->getKey()<<" value: "<<resultado.result->getValue()<<" valid: "<<((resultado.valid)?"TRUE":"FALSE")<<" nextNode: "<<resultado.nextNode<<endl<<endl;

	cout<<"SearchNextRegister("<<resultado.result->getKey()<<") ";
	resultado = testTree.SearchNextRegister(resultado);
	cout<<"key: "<<resultado.result->getKey()<<" value: "<<resultado.result->getValue()<<" valid: "<<((resultado.valid)?"TRUE":"FALSE")<<" nextNode: "<<resultado.nextNode<<endl<<endl;

	cout<<"SearchNextRegister("<<resultado.result->getKey()<<") ";
	resultado = testTree.SearchNextRegister(resultado);
	cout<<"key: "<<resultado.result->getKey()<<" value: "<<resultado.result->getValue()<<" valid: "<<((resultado.valid)?"TRUE":"FALSE")<<" nextNode: "<<resultado.nextNode<<endl<<endl;

	cout<<"SearchNextRegister("<<resultado.result->getKey()<<") ";
	resultado = testTree.SearchNextRegister(resultado);
	cout<<"key: "<<resultado.result->getKey()<<" value: "<<resultado.result->getValue()<<" valid: "<<((resultado.valid)?"TRUE":"FALSE")<<" nextNode: "<<resultado.nextNode<<endl<<endl;

	cout<<"SearchNextRegister("<<resultado.result->getKey()<<") ";
	resultado = testTree.SearchNextRegister(resultado);
	cout<<"key: "<<resultado.result->getKey()<<" value: "<<resultado.result->getValue()<<" valid: "<<((resultado.valid)?"TRUE":"FALSE")<<" nextNode: "<<resultado.nextNode<<endl<<endl;

	cout<<"SearchNextRegister("<<resultado.result->getKey()<<") ";
	resultado = testTree.SearchNextRegister(resultado);
	cout<<"key: "<<resultado.result->getKey()<<" value: "<<resultado.result->getValue()<<" valid: "<<((resultado.valid)?"TRUE":"FALSE")<<" nextNode: "<<resultado.nextNode<<endl<<endl;

	cout<<"SearchNextRegister("<<resultado.result->getKey()<<") ";
	resultado = testTree.SearchNextRegister(resultado);
	cout<<"key: "<<resultado.result->getKey()<<" value: "<<resultado.result->getValue()<<" valid: "<<((resultado.valid)?"TRUE":"FALSE")<<" nextNode: "<<resultado.nextNode<<endl<<endl;

	cout<<"SearchNextRegister("<<resultado.result->getKey()<<") ";
	resultado = testTree.SearchNextRegister(resultado);
	cout<<"key: "<<resultado.result->getKey()<<" value: "<<resultado.result->getValue()<<" valid: "<<((resultado.valid)?"TRUE":"FALSE")<<" nextNode: "<<resultado.nextNode<<endl<<endl;

	cout<<"SearchNextRegister("<<resultado.result->getKey()<<") ";
	resultado = testTree.SearchNextRegister(resultado);
	cout<<"key: "<<resultado.result->getKey()<<" value: "<<resultado.result->getValue()<<" valid: "<<((resultado.valid)?"TRUE":"FALSE")<<" nextNode: "<<resultado.nextNode<<endl<<endl;

	cout<<"SearchNextRegister("<<resultado.result->getKey()<<") ";
	resultado = testTree.SearchNextRegister(resultado);
	cout<<"key: "<<resultado.result->getKey()<<" value: "<<resultado.result->getValue()<<" valid: "<<((resultado.valid)?"TRUE":"FALSE")<<" nextNode: "<<resultado.nextNode<<endl<<endl;

	cout<<"SearchNextRegister("<<resultado.result->getKey()<<") ";
	resultado = testTree.SearchNextRegister(resultado);
	cout<<"key: "<<resultado.result->getKey()<<" value: "<<resultado.result->getValue()<<" valid: "<<((resultado.valid)?"TRUE":"FALSE")<<" nextNode: "<<resultado.nextNode<<endl<<endl;

	cout<<"SearchNextRegister("<<resultado.result->getKey()<<") ";
	resultado = testTree.SearchNextRegister(resultado);
	cout<<"key: "<<resultado.result->getKey()<<" value: "<<resultado.result->getValue()<<" valid: "<<((resultado.valid)?"TRUE":"FALSE")<<" nextNode: "<<resultado.nextNode<<endl<<endl;

	cout<<"SearchNextRegister("<<resultado.result->getKey()<<") ";
	resultado = testTree.SearchNextRegister(resultado);
	cout<<"key: "<<resultado.result->getKey()<<" value: "<<resultado.result->getValue()<<" valid: "<<((resultado.valid)?"TRUE":"FALSE")<<" nextNode: "<<resultado.nextNode<<endl<<endl;

	cout<<"SearchNextRegister("<<resultado.result->getKey()<<") ";
	resultado = testTree.SearchNextRegister(resultado);
	cout<<"key: "<<resultado.result->getKey()<<" value: "<<resultado.result->getValue()<<" valid: "<<((resultado.valid)?"TRUE":"FALSE")<<" nextNode: "<<resultado.nextNode<<endl<<endl;

	cout<<"SearchNextRegister("<<resultado.result->getKey()<<") ";
	resultado = testTree.SearchNextRegister(resultado);
	cout<<"key: "<<resultado.result->getKey()<<" value: "<<resultado.result->getValue()<<" valid: "<<((resultado.valid)?"TRUE":"FALSE")<<" nextNode: "<<resultado.nextNode<<endl<<endl;

	cout<<"SearchNextRegister("<<resultado.result->getKey()<<") ";
	resultado = testTree.SearchNextRegister(resultado);
	cout<<"key: "<<resultado.result->getKey()<<" value: "<<resultado.result->getValue()<<" valid: "<<((resultado.valid)?"TRUE":"FALSE")<<" nextNode: "<<resultado.nextNode<<endl<<endl;

	cout<<"SearchNextRegister("<<resultado.result->getKey()<<") ";
	resultado = testTree.SearchNextRegister(resultado);
	cout<<"key: "<<resultado.result->getKey()<<" value: "<<resultado.result->getValue()<<" valid: "<<((resultado.valid)?"TRUE":"FALSE")<<" nextNode: "<<resultado.nextNode<<endl<<endl;

	cout<<"SearchNextRegister("<<resultado.result->getKey()<<") ";
	resultado = testTree.SearchNextRegister(resultado);
	cout<<"key: "<<resultado.result->getKey()<<" value: "<<resultado.result->getValue()<<" valid: "<<((resultado.valid)?"TRUE":"FALSE")<<" nextNode: "<<resultado.nextNode<<endl<<endl;

	return 0;
}
